



#include "sys_timer.h"
#include "sys_interrupt.h"
#include "sys_uart.h"
#include "sys_gpio.h"
#include "sys_delay.h"
#include "sys_io.h"


#include"mcu_.h"




unt32 mcu_time_ms(void)
{
	return Read_time_ms();
}


void mcu_delay_ms(unt32 k)
{
	delay_ms(k);
};



#include"gl_GraphicsDevice.h"



	#define XSIZE_PHYS_ 480  
	#define YSIZE_PHYS_ 272 
__align(4) unsigned int LCDbuff_[XSIZE_PHYS_*YSIZE_PHYS_];//显存
#include "sys_lcd.h"
#include "sys_lcd_conf.h"
#include "gui_draw.h"
#include "gui_draw_bmp.h"
#include "gui_draw_rgb565.h"
#include "gui_draw_argb8888.h"
#include "gui_draw_bmp.h"


/// 初始化绘图设备
void graphics_init(void){}

void GUI_Draw_RGB565_c(int x,int y,int w,int h, const unsigned short *pic);

void graphics_draw_point(int x, int y, COLOR_RGB color)
{
	GUI_Draw_RGB565_c(x,y,1,1,&color);
//	LCD_Draw_Points_ARGB32(x,y,color);
}

void graphics_fill_area(int left, int top, int w, int h, COLOR_RGB color)
{
	GUI_Clear_RGB565(color);
//	LCD_Draw_Rectangle_ARGB32(left,top,w,h,color);
}

void graphics_draw_image(int left, int top, int w, int h, const COLOR_RGB* color)
{
	GUI_Draw_RGB565_c(left,top,w,h,color);
	
}
//

#include"dev_GT911.h"  // 榴莲派的电路板，触摸屏刚好和摄像头的电路冲突，即：没法同时录像触摸。

IICdevice gt911 = {
	.scl = &gt_scl,
	.sda = &gt_sda
};


/// <summary>
/// 判断屏幕是否按下
/// </summary>
/// <param name="px">按下的x坐标</param>
/// <param name="py">按下的y坐标</param>
/// <returns>1 按下；0 未按下</returns>
int GD_is_touched(int* px, int* py)
{ 
		if (GT911_INT_in() == 0)//低电平查询
		{			
		//	GT911_OnePiontScan();
			if(
			  GT911_OnePiontScan()==0 &&
				g_GT911.X1 >= 0 && g_GT911.X1 <= XSIZE_PHYS_ &&
				g_GT911.Y1 >= 0 && g_GT911.Y1 <= YSIZE_PHYS_
			) {			
			// 实际测试发现坐上的坐标变成右下了，这里对调一下
//				*px = XSIZE_PHYS_ -  g_GT911.X1;   // 
//				*py = YSIZE_PHYS_ -  g_GT911.Y1;   //	
				*px =  g_GT911.X1;   // 
				*py =  g_GT911.Y1;   //	
								
			//	 graphics_draw_point(*px, *py, BLACK);

			//	printfs(" \r\n %d  , %d ",*px,*py);
				return 1;
			}
		}
	//	printfs("-");
		return 0; 
}

/// <summary>
/// 等待按键输入，返回按键值。如果没有输入，就返回0.
/// 如果是单片机上，增加一个条件：如果3秒没有按下，就返回0.
/// </summary>
/// <returns></returns>
int GD_wait_key_input(void){ return 0;}

int get_graph_string(char* str,int str_capacity){return 0;}


/////////////////////   下面是设备的初始化

#include "sys_uart.h"
#include "sys_clock.h"
#include "sys_gpio.h"
#include "sys_delay.h"
#include "sys_cache.h"
#include "sys_interrupt.h"
#include "sys_timer.h"
#include <string.h>
#include <sys_mmu.h>
#include "sys_dma.h"

/*---------------------------------------------------
串口0中断
----------------------------------------------------*/
void UART0_xxISR(void)
{
	u32_t addr=UART0_ADDR;
	u32 s=read32(addr+ 0x08);
	if((s&0x4)==0x4)//接收中断
	{
		char val=read32(addr + 0x00);
		deque_strong_push_back(uart0.uart_u8buffer, val, char);	
	//	Sys_Uart_Put(UART0,val);
	}
	if((s&0x2)==0x2)//发送中断
	{
	//	sysprintf("T0.\r\n");
	}
}
/*---------------------------------------------------
串口1中断
----------------------------------------------------*/
void UART1_xxISR(void)
{
	u32_t addr=UART1_ADDR;
	u32 s=read32(addr+ 0x08);
	if((s&0x4)==0x4)//接收中断
	{
		char val=read32(addr + 0x00);
		deque_strong_push_back(uart1.uart_u8buffer, val, char);
	}
	if((s&0x2)==0x2)//发送中断
	{
	//	sysprintf("T1.\r\n");
	}
}
/*---------------------------------------------------
串口2中断
----------------------------------------------------*/
void UART2_xxISR(void)
{
	u32_t addr=UART2_ADDR;
	u32 s=read32(addr+ 0x08);
	if((s&0x4)==0x4)//接收中断
	{
		char val=read32(addr + 0x00);
		deque_strong_push_back(uart2.uart_u8buffer, val, char);
	}
	if((s&0x2)==0x2)//发送中断
	{
	//	sysprintf("T2.\r\n");
	}
}


// mcu外设初始化。

#define CPU_Frequency_hz   (408000000)  //HZ
//#define CPU_Frequency_hz   (720000000)  //HZ

#include <stdlib.h> 

void mcu_init() 
{
	
  Sys_Clock_Init(CPU_Frequency_hz);
	sys_mmu_init();		
	
// 下面三个函数最后一个参数是0，表示不使能中断。
// 这里使能的中断是库函数默认的中断，下面我们自己定义中断函数。
	// 下面三个函数的串口引脚都是默认引脚，另一种情况改一下函数里的宏定义就好了
	Sys_Uart_Init(UART0,CPU_Frequency_hz,115200,0);//默认  R T E0 E1 ; 另一个情况：  R T F2 F4
	Sys_Uart_Init(UART1,CPU_Frequency_hz,115200,0);//默认  R T A2 A3 ; 另一个情况：  R T D3 D4
	Sys_Uart_Init(UART2,CPU_Frequency_hz,115200,0);//默认  R T E7 E8 ; 另一个情况：  R T D13 D14
	sysprintf("Sys_Start ===...\r\n");
	Sys_Timer1_Init();
	Sys_TimerX_Init(TIMER1,1000,TIMER1_ISR,1); // 1ms的中断

	// 设置串口中断函数
	IRQ_Init(IRQ_LEVEL_1,IRQ_UART0,UART0_xxISR ,3);
	IRQ_Init(IRQ_LEVEL_1,IRQ_UART1,UART1_xxISR ,3);
	IRQ_Init(IRQ_LEVEL_1,IRQ_UART2,UART2_xxISR ,3);		
	sysSetLocalInterrupt(ENABLE_IRQ);//开总中断


// 下面初始化RGB屏幕

	Sys_LCD_Init(XSIZE_PHYS,YSIZE_PHYS,(unsigned int *)LCDbuff_,NULL);

	//设置画布
	Set_Canvas((unsigned int *)LCDbuff_,XSIZE_PHYS,YSIZE_PHYS,CMODE_RGB565);	
	
	GT911_Init(&gt911,&gt_rst,&gt_int);

//	GT911_Test(&gt911,&gt_rst,&gt_int);

}

void print_str_(char* str, int len)
{
	mcu_uart_sendstring_(	&uart0,str,len);
}

#if 1   // 1 : 逐个发送数据。 0：DMA发送数据，未调试成功。

/// <summary>
/// 串口1发送一个字符串。以空字符'\0'作为字符串结束符。
/// </summary>
/// <param name="str">发送的字符串</param>
void mcu_uart_sendstring(uart* u, const char* str) {
	int n=256;
	int i;
	if(u==&uart0){
		for(i=0;i<n&&str[i]!=0;i++)Sys_Uart_Put(UART0,str[i]);	
	}
	if(u==&uart1){
		for(i=0;i<n&&str[i]!=0;i++)Sys_Uart_Put(UART1,str[i]);	
	}
	if(u==&uart2){
		for(i=0;i<n&&str[i]!=0;i++)Sys_Uart_Put(UART2,str[i]);		
	}	
}

/// <summary>
/// 串口1发送字符串的前n各字符。
/// </summary>
/// <param name="str">发送的字符串</param>
/// <param name="n">字符的个数</param>
void mcu_uart_sendstring_(uart* u, const char* str, int n){
		
	int i;
	if(n>256)n=256;
	if(u==&uart0){
		for(i=0;i<n;i++) Sys_Uart_Put(UART0,str[i]);	
	}
	if(u==&uart1){
		for(i=0;i<n;i++) Sys_Uart_Put(UART1,str[i]);	
	}
	if(u==&uart2){
		for(i=0;i<n;i++) Sys_Uart_Put(UART2,str[i]);	
	}	
}
//


#else

/// <summary>
/// 串口1发送一个字符串。以空字符'\0'作为字符串结束符。
/// </summary>
/// <param name="str">发送的字符串</param>
void mcu_uart_sendstring(uart* u, const char* str) {
	
	int n=uart_send_buffer_len;
	int i;
	if(u==&uart0){
		while(uart0_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n&&str[i]!=0;i++) uart0.send_buffer[i]=str[i];
		uart_tx_dma_config(UART0,0,&uart0_tx_dma,(unsigned int)uart0.send_buffer,i);		
		uart0_is_send_finish = false;
	}
	if(u==&uart1){
		while(uart1_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n&&str[i]!=0;i++)uart1.send_buffer[i]=str[i];	
		uart_tx_dma_config(UART1,1,&uart1_tx_dma,(unsigned int)uart1.send_buffer,i);		
		uart1_is_send_finish = false;
	}
	if(u==&uart2){
		while(uart2_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n&&str[i]!=0;i++)uart2.send_buffer[i]=str[i];	
		uart_tx_dma_config(UART2,2,&uart2_tx_dma,(unsigned int)uart2.send_buffer,i);		
		uart2_is_send_finish = false;
	}	
	
}

/// <summary>
/// 串口1发送字符串的前n各字符。
/// </summary>
/// <param name="str">发送的字符串</param>
/// <param name="n">字符的个数</param>
void mcu_uart_sendstring_(uart* u, const char* str, int n){
	n= Min(n, uart_send_buffer_len);
	if(n<1)return;
	int i;
	if(u==&uart0){
		while(uart0_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n;i++)uart0.send_buffer[i]=str[i];	
		uart_tx_dma_config(UART0,0,&uart0_tx_dma,(unsigned int)uart0.send_buffer,i);		
		uart0_is_send_finish = false;
	}
	if(u==&uart1){
		while(uart1_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n;i++)uart1.send_buffer[i]=str[i];	
		uart_tx_dma_config(UART1,1,&uart1_tx_dma,(unsigned int)uart1.send_buffer,i);		
		uart1_is_send_finish = false;
	}
	if(u==&uart2){
		while(uart2_is_send_finish);  //等待串口空闲（发送完成）
		for(i=0;i<n;i++)uart2.send_buffer[i]=str[i];	
		uart_tx_dma_config(UART2,2,&uart2_tx_dma,(unsigned int)uart2.send_buffer,i);		
		uart2_is_send_finish = false;
	}	
}
//

#endif


// 当前的iic设备有：gt911 触摸板，spi有w25q128
// gpio gt_int, gt_rst, gt_sda, gt_scl;  // 分别是 a1,a0,e12,e11,


/// 设置io口的输出值。
void mcu_set_io(gpio* io, unt32 value)
{
	if(io == &gt_int)  value ?  GPIO_SET(GPIOE,GPIO_Pin_3) : GPIO_RESET(GPIOE,GPIO_Pin_3);
	if(io == &gt_sda)  value ?  GPIO_SET(GPIOE,GPIO_Pin_12) : GPIO_RESET(GPIOE,GPIO_Pin_12);
	if(io == &gt_scl)  value ?  GPIO_SET(GPIOE,GPIO_Pin_11) : GPIO_RESET(GPIOE,GPIO_Pin_11);
	
}

/// 读取io口的值。
unt32 mcu_read_io(gpio* io)
{
	if(io == &gt_int) return GPIO_READ(GPIOE,GPIO_Pin_3) ; 
	if(io == &gt_sda) return GPIO_READ(GPIOE,GPIO_Pin_12) ;
	if(io == &gt_scl) return GPIO_READ(GPIOE,GPIO_Pin_11) ;
	return  0;
}


// 将io口设置成输出模式
void mcu_set_io_out(gpio* io)
{
	//  GPIO_PuPd_UP       GPIO_PuPd_NOPULL
//	if(io == &gt_int) GPIO_Congif(GPIOE,GPIO_Pin_3,GPIO_Mode_OUT,GPIO_PuPd_NOPULL) ; 
//	if(io == &gt_sda) GPIO_Congif(GPIOE,GPIO_Pin_12,GPIO_Mode_OUT,GPIO_PuPd_UP) ;
//	if(io == &gt_scl) GPIO_Congif(GPIOE,GPIO_Pin_11,GPIO_Mode_OUT,GPIO_PuPd_UP) ;

	if(io == &gt_int) GPIO_Congif(GPIOE,GPIO_Pin_3,GPIO_Mode_OUT,GPIO_PuPd_NOPULL) ; 
	if(io == &gt_sda) GPIO_Congif(GPIOE,GPIO_Pin_12,GPIO_Mode_OUT,GPIO_PuPd_NOPULL) ;
	if(io == &gt_scl) GPIO_Congif(GPIOE,GPIO_Pin_11,GPIO_Mode_OUT,GPIO_PuPd_NOPULL) ;

}

// 将io口设置成输入模式
void mcu_set_io_in(gpio* io)
{
//	if(io == &gt_int) GPIO_Congif(GPIOE,GPIO_Pin_3,GPIO_Mode_IN,GPIO_PuPd_UP) ; 
//	if(io == &gt_sda) GPIO_Congif(GPIOE,GPIO_Pin_12,GPIO_Mode_IN,GPIO_PuPd_UP) ;
//	if(io == &gt_scl) GPIO_Congif(GPIOE,GPIO_Pin_11,GPIO_Mode_IN,GPIO_PuPd_UP) ;


	if(io == &gt_int) GPIO_Congif(GPIOE,GPIO_Pin_3,GPIO_Mode_IN,GPIO_PuPd_NOPULL) ; 
	if(io == &gt_sda) GPIO_Congif(GPIOE,GPIO_Pin_12,GPIO_Mode_IN,GPIO_PuPd_NOPULL) ;
	if(io == &gt_scl) GPIO_Congif(GPIOE,GPIO_Pin_11,GPIO_Mode_IN,GPIO_PuPd_NOPULL) ;
}

//











